﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace FeiYang
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static string 多开器类名 = "LDRemoteLoginFrame";
        public static string 多开器标题 = "雷电多开器";

        public static string 多开器文件名 = "dnmultiplayerex.exe";
        public static IntPtr 多开器句柄 = IntPtr.Zero;
        private int 选择的模拟器数量 = 0;

        private List<挂机人物_> 挂机人物组 = new List<挂机人物_>();

        public static MainWindow _this;
        public static bool UI完成初始化 = false;
        public static int 当前挂机人物索引 = 0;
        public static 线程_ 执行线程;

        public MainWindow()
        {
            _this = this;
            InitializeComponent();
            this.Title = "飞扬传世";
            this.按钮组.第一个被选择 += this.checkBox_Checked;
            this.按钮组.第二个被选择 += this.checkBox1_Checked;
            this.按钮组.第三个被选择 += this.checkBox2_Checked;
            this.按钮组.第四个被选择 += this.checkBox3_Checked;
            this.按钮组.第一个被取消 += this.checkBox_Unchecked;
            this.按钮组.第二个被取消 += this.checkBox1_Unchecked;
            this.按钮组.第三个被取消 += this.checkBox2_Unchecked;
            this.按钮组.第四个被取消 += this.checkBox3_Unchecked;
            this.总布局_.Visibility = Visibility.Hidden;
            this.模拟器一设置.面板名称.Content = "模拟器-1设置";
            this.模拟器二设置.面板名称.Content = "模拟器-2设置";
            this.模拟器三设置.面板名称.Content = "模拟器-3设置";
            this.模拟器四设置.面板名称.Content = "模拟器-4设置";

            this.模拟器一设置.左角色被选择 += this.角色左_0_Checked;
            this.模拟器一设置.右角色被选择 += this.角色右_0_Checked;

            this.模拟器二设置.左角色被选择 += this.角色左_1_Checked;
            this.模拟器二设置.右角色被选择 += this.角色右_1_Checked;

            this.模拟器三设置.左角色被选择 += this.角色左_2_Checked;
            this.模拟器三设置.右角色被选择 += this.角色右_2_Checked;

            this.模拟器四设置.左角色被选择 += this.角色左_3_Checked;
            this.模拟器四设置.右角色被选择 += this.角色右_3_Checked;

            读取窗口位置();
            this.挂机人物组 = new List<挂机人物_>();
            if ((bool)this.按钮组.checkBox.IsChecked)
            {
                选择的模拟器数量++;
            }
            if ((bool)this.按钮组.checkBox1.IsChecked)
            {
                选择的模拟器数量++;
            }
            if ((bool)this.按钮组.checkBox2.IsChecked)
            {
                选择的模拟器数量++;
            }
            if ((bool)this.按钮组.checkBox3.IsChecked)
            {
                选择的模拟器数量++;
            }
            if (选择的模拟器数量 > 0)
            {
                button4_Copy1.IsEnabled = true;
            }
            UI完成初始化 = true;
            读取窗口位置();
        }

        private void 读取窗口位置()
        {
            // 获取应用程序的设置
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["窗口位置"];
            if (内容 != null)
            {
                var strs = 内容.Value.Split(',');
                this.Left = int.Parse(strs[0]);
                this.Top = int.Parse(strs[1]);
                this.Width = int.Parse(strs[2]);
                this.Height = int.Parse(strs[3]);
            }
        }

        private void 保存窗口位置(object sender, EventArgs e)
        {
            // 获取应用程序的设置
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["窗口位置"];
            if (内容 == null)
            {
                内容 = new KeyValueConfigurationElement("窗口位置", "");
                设置值组.Add(内容);
            }
            var 值 = ((Window)sender).Left.ToString() + "," + ((Window)sender).Top.ToString() + "," + ((Window)sender).Width.ToString() + "," + ((Window)sender).Height.ToString();
            内容.Value = 值;
            config.Save(ConfigurationSaveMode.Modified);
        }

        private void checkBox_Checked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 0;
            选择的模拟器数量++;
            button4_Copy1.IsEnabled = true;
        }

        private void checkBox_Unchecked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 0;
            选择的模拟器数量--;
            if (选择的模拟器数量 <= 0)
            {
                button4_Copy1.IsEnabled = false;
            }
        }

        private void checkBox1_Checked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 1;
            选择的模拟器数量++;
            button4_Copy1.IsEnabled = true;
        }

        private void checkBox1_Unchecked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 0;
            选择的模拟器数量--;
            if (选择的模拟器数量 <= 0)
            {
                button4_Copy1.IsEnabled = false;
            }
        }

        private void checkBox2_Checked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 2;
            选择的模拟器数量++;
            button4_Copy1.IsEnabled = true;
        }

        private void checkBox2_Unchecked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 0;
            选择的模拟器数量--;
            if (选择的模拟器数量 <= 0)
            {
                button4_Copy1.IsEnabled = false;
            }
        }

        private void checkBox3_Checked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 3;
            选择的模拟器数量++;
            button4_Copy1.IsEnabled = true;
        }

        private void checkBox3_Unchecked(object sender, EventArgs e)
        {
            tabControl.SelectedIndex = 0;
            选择的模拟器数量--;
            if (选择的模拟器数量 <= 0)
            {
                button4_Copy1.IsEnabled = false;
            }
        }

        private string 获取记录键(RadioButton radio, string 前缀)
        {
            return radio.IsChecked == true ? 前缀 + "_左" : 前缀 + "_右";
        }

        private void button4_Click(object sender, RoutedEventArgs e)
        {
            if ((string)button4.Content == "结束")
            {
                执行线程.退出();
                button4.Content = "启动多开器";
                button4_Copy1.Content = "启动";
                button4_Copy1.IsEnabled = true;
                button4_Copy.IsEnabled = false;
                button4.IsEnabled = true;
                return;
            }

            if (多开器句柄 == IntPtr.Zero)
            {
                多开器句柄 = 窗口_.FindWindow(多开器类名, 多开器标题);
            }

            if (多开器句柄 == IntPtr.Zero)
            {
                var 雷电多开器 = 获取多开器文件路径();
                if (雷电多开器 != "")
                {
                    var p = Process.Start(雷电多开器);
                    p.WaitForInputIdle();
                    其他_.打印("启动多开器");
                }
                其他_.延迟(其他_.时长_1000);
                多开器句柄 = 窗口_.FindWindow(多开器类名, 多开器标题);
            }

            if (多开器句柄 == IntPtr.Zero)
            {
                其他_.打印("未能找到多开器程序");
                return;
            }
            // 置顶多开器;
            button4.IsEnabled = false;
            button4.Content = "结束";

            其他_.延迟(其他_.时长_1000);
            if (窗口_.窗口是最小化的(多开器句柄))
            {
                窗口_.恢复窗口(多开器句柄);
                其他_.延迟(其他_.时长_1000);
            }
            窗口_.置顶窗口(多开器句柄);
            其他_.打印("设置置顶窗口");
            其他_.延迟(其他_.时长_2000);
            var 模拟器名称组 = 多开器识别_.识别模拟器标题名();
            if (模拟器名称组[0] != "")
            {
                this.按钮组.checkBox.Content = 模拟器名称组[0];
                this.模拟器一设置.面板名称.Content = 模拟器名称组[0] + " 设置页";

                var 是否启动了 = 模拟器名称组[4] == "运行中";
                if (是否启动了)
                {
                    this.按钮组.checkBox.IsChecked = true;
                }
                var 左或右 = 读取挂机角色(模拟器名称组[0]);
                if (左或右 == "左")
                {
                    this.模拟器一设置.挂机人物_左.IsChecked = true;
                }
                else
                {
                    this.模拟器一设置.挂机人物_右.IsChecked = true;
                }
                var dic = 读取配置记录(获取记录键(this.模拟器一设置.挂机人物_左, 模拟器名称组[0]));
                if (dic != null)
                {
                    读取设置记录(dic, this.模拟器一设置);
                }
            }
            else
            {
                this.按钮组.checkBox.Foreground = new SolidColorBrush(Color.FromArgb(255, 175, 175, 175));
                this.按钮组. checkBox.Content = "无效";
                this.按钮组.checkBox.IsEnabled = false;
            }

            if (模拟器名称组[1] != "")
            {
                this.按钮组.checkBox1.Content = 模拟器名称组[1];
                this.模拟器二设置.面板名称.Content = 模拟器名称组[1] + " 设置页";
                var 是否启动了 = 模拟器名称组[5] == "运行中";
                if (是否启动了)
                {
                    this.按钮组.checkBox1.IsChecked = true;
                }
                var 左或右 = 读取挂机角色(模拟器名称组[1]);
                if (左或右 == "左")
                {
                    this.模拟器二设置.挂机人物_左.IsChecked = true;
                }
                else
                {
                    this.模拟器二设置.挂机人物_右.IsChecked = true;
                }
                var dic = 读取配置记录(获取记录键(this.模拟器二设置.挂机人物_左, 模拟器名称组[1]));
                if (dic != null)
                {
                    读取设置记录(dic, this.模拟器二设置);
                }
            }
            else
            {
                this.按钮组.Foreground = new SolidColorBrush(Color.FromArgb(255, 175, 175, 175));
                this.按钮组.checkBox1.Content = "无效";
                this.按钮组.checkBox1.IsEnabled = false;
            }

            if (模拟器名称组[2] != "")
            {
                this.按钮组.checkBox2.Content = 模拟器名称组[2];
                this.模拟器三设置.面板名称.Content = 模拟器名称组[2] + " 设置页";
                var 是否启动了 = 模拟器名称组[6] == "运行中";
                if (是否启动了)
                {
                    this.按钮组.checkBox2.IsChecked = true;
                }
                var 左或右 = 读取挂机角色(模拟器名称组[2]);
                if (左或右 == "左")
                {
                    this.模拟器三设置.挂机人物_左.IsChecked = true;
                }
                else
                {
                    this.模拟器三设置.挂机人物_右.IsChecked = true;
                }
                var dic = 读取配置记录(获取记录键(this.模拟器三设置.挂机人物_左, 模拟器名称组[2]));
                if (dic != null)
                {
                    读取设置记录( dic, this.模拟器三设置);
                }
            }
            else
            {
                this.按钮组.checkBox2.Foreground = new SolidColorBrush(Color.FromArgb(255, 175, 175, 175));
                this.按钮组.checkBox2.Content = "无效";
                this.按钮组.checkBox2.IsEnabled = false;
            }

            if (模拟器名称组[3] != "")
            {
                this.按钮组.checkBox3.Content = 模拟器名称组[3];
                this.模拟器四设置.面板名称.Content = 模拟器名称组[3] + " 设置页";

                var 是否启动了 = 模拟器名称组[7] == "运行中";
                if (是否启动了)
                {
                    this.按钮组.checkBox3.IsChecked = true;
                }
                var 左或右 = 读取挂机角色(模拟器名称组[3]);
                if (左或右 == "左")
                {
                    this.模拟器四设置.挂机人物_左.IsChecked = true;
                }
                else
                {
                    this.模拟器四设置.挂机人物_右.IsChecked = true;
                }
                var dic = 读取配置记录(获取记录键(this.模拟器四设置.挂机人物_左, 模拟器名称组[3]));
                if (dic != null)
                {
                    读取设置记录(dic, this.模拟器四设置);
                }
            }
            else
            {
                this.按钮组.  checkBox3.Foreground = new SolidColorBrush(Color.FromArgb(255, 175, 175, 175));
                this.按钮组. checkBox3.Content = "无效";
                this.按钮组.checkBox3.IsEnabled = false;
            }

            if (this.总布局_.Visibility == Visibility.Hidden)
            {
                this.总布局_.Visibility = Visibility.Visible;
            }
        }

        private void 读取设置记录(Dictionary<string, string> dic, 挂机面板_ 挂机面板)
        {
            dic.TryGetValue("人物名称", out var 人物名称);
            挂机面板.人物名称.Text = 人物名称;
            dic.TryGetValue("人物职业", out var 人物职业);
            挂机面板.人物职业.Text = 人物职业;
            dic.TryGetValue("人物等级", out var 人物等级);
            挂机面板.人物等级.Text = 人物等级;
            dic.TryGetValue("二级密码", out var 二级密码);
            挂机面板.二级密码.Password = 二级密码;
            dic.TryGetValue("特殊挂机", out var 特殊挂机);
            挂机面板.特殊挂机.IsChecked = 特殊挂机 == "真"? true: false;
            dic.TryGetValue("捡药", out var 捡药);
            挂机面板.捡药.IsChecked = 捡药 == "真" ? true : false;
            dic.TryGetValue("买药", out var 买药);
            挂机面板.买药.IsChecked = 买药 == "真" ? true : false;
            dic.TryGetValue("买药输入框", out var 买药输入框);
            挂机面板.买药输入框.Text = 买药输入框;
            dic.TryGetValue("扔药", out var 扔药);
            挂机面板.扔药.IsChecked = 扔药 == "真" ? true : false;
            dic.TryGetValue("扔药输入框", out var 扔药输入框);
            挂机面板.扔药输入框.Text = 扔药输入框;
            dic.TryGetValue("材料行购买", out var 材料行购买);
            挂机面板.材料行购买.IsChecked = 材料行购买 == "真" ? true : false;
            dic.TryGetValue("材料行购买下拉框", out var 材料行购买下拉框);
            挂机面板.材料行购买下拉框.Text = 材料行购买下拉框;
            dic.TryGetValue("命令模式", out var 命令模式);
            挂机面板.命令模式.IsChecked = 命令模式 == "真" ? true : false;
            dic.TryGetValue("号令角色名输入框", out var 号令角色名输入框);
            挂机面板.号令角色名输入框.Text = 号令角色名输入框;
            dic.TryGetValue("专打怪物", out var 专打怪物);
            挂机面板.专打怪物.IsChecked = 专打怪物 == "真" ? true : false;
            dic.TryGetValue("专打怪物输入框", out var 专打怪物输入框);
            挂机面板.专打怪物输入框.Text = 专打怪物输入框;
            dic.TryGetValue("专打boss", out var 专打boss);
            挂机面板.专打boss.IsChecked = 专打boss == "真" ? true : false;
            dic.TryGetValue("专打boss输入框", out var 专打boss输入框);
            挂机面板.专打boss输入框.Text = 专打boss输入框;
            dic.TryGetValue("挂机地图下拉框", out var 挂机地图下拉框);
            挂机面板.挂机地图下拉框.Text = 挂机地图下拉框;
            dic.TryGetValue("定点挂机", out var 定点挂机);
            挂机面板.定点挂机.IsChecked = 定点挂机 == "真" ? true : false;
            dic.TryGetValue("定点挂机坐标输入框", out var 定点挂机坐标输入框);
            挂机面板.定点挂机坐标输入框.Text = 定点挂机坐标输入框;
            dic.TryGetValue("主动攻击", out var 主动攻击);
            挂机面板.主动攻击.IsChecked = 主动攻击 == "真" ? true : false;
            dic.TryGetValue("主动施毒", out var 主动施毒);
            挂机面板.主动施毒.IsChecked = 主动施毒 == "真" ? true : false;
            dic.TryGetValue("主动捡物", out var 主动捡物);
            挂机面板.主动捡物.IsChecked = 主动捡物 == "真" ? true : false;
            dic.TryGetValue("遇人回避", out var 遇人回避);
            挂机面板.遇人回避.IsChecked = 遇人回避 == "真" ? true : false;
            dic.TryGetValue("Boss优先", out var Boss优先);
            挂机面板.Boss优先.IsChecked = Boss优先 == "真" ? true : false;
            dic.TryGetValue("头目优先", out var 头目优先);
            挂机面板.头目优先.IsChecked = 头目优先 == "真" ? true : false;
            dic.TryGetValue("高级怪物", out var 高级怪物);
            挂机面板.高级怪物.IsChecked = 高级怪物 == "真" ? true : false;
            dic.TryGetValue("高级怪物输入框", out var 高级怪物输入框);
            挂机面板.高级怪物输入框.Text = 高级怪物输入框;
            dic.TryGetValue("组队设置", out var 组队设置);
            挂机面板.组队设置.IsChecked = 组队设置 == "真" ? true : false;
            dic.TryGetValue("组队设置输入框", out var 组队设置输入框);
            挂机面板.组队设置输入框.Text = 组队设置输入框;
            dic.TryGetValue("军机任务", out var 军机任务);
            挂机面板.军机任务.IsChecked = 军机任务 == "真" ? true : false;
            dic.TryGetValue("军机任务下拉框", out var 军机任务下拉框);
            挂机面板.军机任务下拉框.SelectedIndex = int.Parse (军机任务下拉框);
            dic.TryGetValue("王城任务", out var 王城任务);
            挂机面板.王城任务.IsChecked = 王城任务 == "真" ? true : false;
            dic.TryGetValue("不领押镖礼盒", out var 不领押镖礼盒);
            挂机面板.不领押镖礼盒.IsChecked = 不领押镖礼盒 == "真" ? true : false;
            dic.TryGetValue("王城诏令", out var 王城诏令);
            挂机面板.王城诏令.IsChecked = 王城诏令 == "真" ? true : false;
            dic.TryGetValue("声望任务", out var 声望任务);
            挂机面板.声望任务.IsChecked = 声望任务 == "真" ? true : false;
            dic.TryGetValue("骑兵任务", out var 骑兵任务);
            挂机面板.骑兵任务.IsChecked = 骑兵任务 == "真" ? true : false;
            dic.TryGetValue("押镖任务", out var 押镖任务);
            挂机面板.押镖任务.IsChecked = 押镖任务 == "真" ? true : false;
            dic.TryGetValue("挖矿任务", out var 挖矿任务);
            挂机面板.挖矿任务.IsChecked = 挖矿任务 == "真" ? true : false;
            dic.TryGetValue("论武任务", out var 论武任务);
            挂机面板.论武任务.IsChecked = 论武任务 == "真" ? true : false;
            dic.TryGetValue("无需设置", out var 无需设置);
            挂机面板.无需设置.IsChecked = 无需设置 == "真" ? true : false;
            dic.TryGetValue("输出日志", out var 输出日志);
            挂机面板.输出日志.IsChecked = 输出日志 == "真" ? true : false;
            dic.TryGetValue("开启录屏", out var 开启录屏);
            挂机面板.开启录屏.IsChecked = 开启录屏 == "真" ? true : false;
            dic.TryGetValue("包裹监测间隔输入框", out var 包裹监测间隔输入框);
            挂机面板.包裹监测间隔输入框.Text = 包裹监测间隔输入框;
            dic.TryGetValue("下线等待输入框", out var 下线等待输入框);
            挂机面板.下线等待输入框.Text = 下线等待输入框;
            dic.TryGetValue("自动炼狱时间", out var 自动炼狱时间);
            挂机面板.自动炼狱时间.IsChecked = 自动炼狱时间 == "真" ? true : false;
            dic.TryGetValue("自动金币", out var 自动金币);
            挂机面板.自动金币.IsChecked = 自动金币 == "真" ? true : false;
            dic.TryGetValue("治疗数量", out var 治疗数量);
            挂机面板.治疗数量.Text = 治疗数量;
            dic.TryGetValue("红药数量", out var 红药数量);
            挂机面板.红药数量.Text = 红药数量;
            dic.TryGetValue("蓝药数量", out var 蓝药数量);
            挂机面板.蓝药数量.Text = 蓝药数量;
            dic.TryGetValue("道符数量", out var 道符数量);
            挂机面板.道符数量.Text = 道符数量;
            dic.TryGetValue("红毒数量", out var 红毒数量);
            挂机面板.红毒数量.Text = 红毒数量;
            dic.TryGetValue("绿毒数量", out var 绿毒数量);
            挂机面板.绿毒数量.Text = 绿毒数量;
            dic.TryGetValue("随机数量", out var 随机数量);
            挂机面板.随机数量.Text = 随机数量;
            dic.TryGetValue("圣水数量", out var 圣水数量);
            挂机面板.圣水数量.Text = 圣水数量;
            dic.TryGetValue("F1", out var F1);
            挂机面板.F1.Text = F1;
            dic.TryGetValue("F2", out var F2);
            挂机面板.F2.Text = F2;
            dic.TryGetValue("F3", out var F3);
            挂机面板.F3.Text = F3;
            dic.TryGetValue("F4", out var F4);
            挂机面板.F4.Text = F4;
            dic.TryGetValue("F5", out var F5);
            挂机面板.F5.Text = F5;
            dic.TryGetValue("F6", out var F6);
            挂机面板.F6.Text = F6;
            dic.TryGetValue("F7", out var F7);
            挂机面板.F7.Text = F7;
            dic.TryGetValue("F8", out var F8);
            挂机面板.F8.Text = F8;
        }

        private string 获取雷电多开器默认路径()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["多开器路径"];
            if (内容 == null)
            {
                内容 = new KeyValueConfigurationElement("多开器路径", "");
                设置值组.Add(内容);
            }
            else
            {
                if (File.Exists(内容.Value))
                {
                    return 内容.Value;
                }
            }

            string 大概目录 = "leidian\\ldmutiplayer\\";

            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (var d in drives)
            {
                if (d.IsReady)
                {
                    try
                    {
                        var 全名 = d.Name + 大概目录 + 多开器文件名;
                        if (File.Exists(全名))
                        {
                            内容.Value = 全名;
                            config.Save(ConfigurationSaveMode.Modified);
                            return 全名;
                        }
                    }
                    catch
                    {
                        return "";
                    }
                }
            }
            return "";
        }

        private string 获取多开器文件路径()
        {
            var 文件全名 = 获取雷电多开器默认路径();
            if (文件全名 != "")
            {
                return 文件全名;
            }
            else
            {
                其他_.打印("默认路径未找到多开器执行文件, 稍后将全盘查找多开器文件, 可能需要较长时间");
            }
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["多开器路径"];
            if (内容 == null)
            {
                内容 = new KeyValueConfigurationElement("多开器路径", "");
                设置值组.Add(内容);
            }
            文件全名 = 全电脑搜索指定文件(多开器文件名);
            if (文件全名 != "")
            {
                内容.Value = 文件全名;
                config.Save(ConfigurationSaveMode.Modified);
            }
            return 文件全名;
        }

        private string 全电脑搜索指定文件(string 文件名)
        {
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (var d in drives)
            {
                if (d.IsReady)
                {
                    try
                    {
                        var dirs = Directory.GetDirectories(d.Name);
                        foreach (var dir in dirs)
                        {
                            try
                            {
                                var fs = Directory.GetFiles(dir, 文件名, SearchOption.AllDirectories);
                                if (fs.Length > 0)
                                {
                                    var f = fs[0];
                                    if (File.Exists(f))
                                    {
                                        return f;
                                    }
                                }
                            }
                            catch
                            {
                                其他_.打印("无权限" + " " + dir);
                            }
                        }
                    }
                    catch
                    {
                        其他_.打印("驱动器 : " + d.Name + " 无权限");
                    }
                }
            }
            return "";
        }

        private void button4_Copy1_Click(object sender, RoutedEventArgs e)
        {
            if ((string)button4_Copy1.Content == "启动")
            {
                if ((bool)this.按钮组.checkBox.IsChecked)
                {
                    // 0
                    string 名称 = this.按钮组.checkBox.Content.ToString();
                    var 运行中 = 窗口_.FindWindow(挂机人物_.lpClassName, 名称) != IntPtr.Zero;
                    其他_.打印("需要启动模拟器-" + 名称);
                    挂机角色_ 挂机角色 = this.模拟器一设置.挂机人物_左.IsChecked == true ? 挂机角色_.左 : 挂机角色_.右;
                    保存挂机角色(名称, 挂机角色);
                    string 配置段键 = 获取记录键(this.模拟器一设置.挂机人物_左, 名称);
                    this.挂机人物组.Add(this.模拟器一设置.转为挂机人物(配置段键, 名称, 0, 运行中));
                    保存设置(配置段键, this.模拟器一设置);
                }
                if ((bool)this.按钮组.checkBox1.IsChecked)
                {
                    // 1
                    string 名称 = this.按钮组.checkBox1.Content.ToString();
                    var 运行中 = 窗口_.FindWindow(挂机人物_.lpClassName, 名称) != IntPtr.Zero;
                    其他_.打印("需要启动模拟器-" + 名称);
                    挂机角色_ 挂机角色 = (bool)this.模拟器二设置.挂机人物_左.IsChecked ? 挂机角色_.左 : 挂机角色_.右;
                    保存挂机角色(名称, 挂机角色);
                    string 配置段键 = 获取记录键(this.模拟器二设置.挂机人物_左, 名称);
                    this.挂机人物组.Add(this.模拟器二设置.转为挂机人物(配置段键, 名称, 1, 运行中));
                    保存设置(配置段键, this.模拟器二设置);
                }
                if ((bool)this.按钮组.checkBox2.IsChecked)
                {
                    // 2
                    string 名称 = this.按钮组.checkBox2.Content.ToString();
                    var 运行中 = 窗口_.FindWindow(挂机人物_.lpClassName, 名称) != IntPtr.Zero;
                    其他_.打印("需要启动模拟器-" + 名称);
                    挂机角色_ 挂机角色 = (bool)this.模拟器三设置.挂机人物_左.IsChecked ? 挂机角色_.左 : 挂机角色_.右;
                    string 配置段键 = 获取记录键(this.模拟器三设置.挂机人物_左, 名称);
                    this.挂机人物组.Add(this.模拟器三设置.转为挂机人物(配置段键, 名称, 2, 运行中));
                    保存设置(配置段键, this.模拟器三设置);
                }
                if ((bool)this.按钮组.checkBox3.IsChecked)
                {
                    // 3
                    string 名称 = this.按钮组.checkBox3.Content.ToString();
                    var 运行中 = 窗口_.FindWindow(挂机人物_.lpClassName, 名称) != IntPtr.Zero;
                    其他_.打印("需要启动模拟器-" + 名称);
                    挂机角色_ 挂机角色 = (bool)this.模拟器四设置.挂机人物_左.IsChecked ? 挂机角色_.左 : 挂机角色_.右;
                    string 配置段键 = 获取记录键(this.模拟器四设置.挂机人物_左, 名称);
                    this.挂机人物组.Add(this.模拟器四设置.转为挂机人物(配置段键, 名称, 3,  运行中));
                    保存设置(配置段键, this.模拟器四设置);
                }
            }
            if (this.挂机人物组.Count == 0)
            {
                其他_.打印("没有挂机人物");
                return;
            }

            if (this.挂机人物组.Count > 1)
            {
                var 有买药的 = this.挂机人物组.Find(r => r.买药.HasValue && r.买药.Value);
                if (有买药的 != null)
                {
                    var 结果 = MessageBox.Show("买药不能多开, 如果确实希望买药, 请关闭其他模拟器启动", "确认对话框", MessageBoxButton.YesNo);
                    if (结果 == MessageBoxResult.Yes || 结果 == MessageBoxResult.OK)
                    {
                        foreach (var r in this.挂机人物组)
                        {
                            if (r != 有买药的) 按序号取消选择(r.启动序号);
                        }
                        this.挂机人物组.Clear();
                        return;
                    }
                    else
                    {
                        按序号取消选择(有买药的.启动序号);
                        this.挂机人物组.Clear();
                        return;
                    }
                }
                var 有扔药的 = this.挂机人物组.Find(r => r.扔药.HasValue && r.扔药.Value);
                var 有捡药的 = this.挂机人物组.Find(r => r.捡药.HasValue && r.捡药.Value);
                if (有扔药的 != null && 有捡药的 != null)
                {
                    if (this.挂机人物组.Count > 2)
                    {
                        var 结果 = MessageBox.Show("扔药或捡药挂机最多能开两个模拟器, 且必须一个是扔药另一个是捡药, 是否继续扔药及捡药", "确认对话框", MessageBoxButton.YesNo);
                        if (结果 == MessageBoxResult.Yes || 结果 == MessageBoxResult.OK)
                        {
                            foreach (var r in this.挂机人物组)
                            {
                                if (r != 有扔药的 && r != 有捡药的) 按序号取消选择(r.启动序号);
                            }
                            this.挂机人物组.Clear();
                            return;
                        }
                        else
                        {
                            按序号取消选择(有扔药的.启动序号);
                            按序号取消选择(有捡药的.启动序号);
                            this.挂机人物组.Clear();
                            return;
                        }
                    }
                }
                else if (有扔药的 != null || 有捡药的 != null)
                {
                    if (this.挂机人物组.Count > 1)
                    {
                        var 扔或捡 = 有扔药的 == null ? "捡药" : "扔药";
                        var 结果 = MessageBox.Show("扔药或捡药挂机最多能开两个模拟器, 切必须一个是扔药另一个是捡药, 是否开始 " + 扔或捡, "确认对话框", MessageBoxButton.YesNo);
                        if (结果 == MessageBoxResult.Yes || 结果 == MessageBoxResult.OK)
                        {
                            var 结果人物 = 有扔药的 == null ? 有捡药的 : 有扔药的;
                            foreach (var r in this.挂机人物组)
                            {
                                if (r != 结果人物) 按序号取消选择(r.启动序号);
                            }
                            this.挂机人物组.Clear();
                            return;
                        }
                        else
                        {
                            var 结果人物 = 有扔药的 == null ? 有捡药的 : 有扔药的;
                            按序号取消选择(结果人物.启动序号);
                            this.挂机人物组.Clear();
                            return;
                        }
                    }
                }
            }

            执行线程 = new 线程_(() =>
            {
                var 当前人物 = this.挂机人物组[当前挂机人物索引];
                当前人物.执行(this.挂机人物组);
                if (!当前人物.连续执行任务)
                {
                    当前挂机人物索引 = 当前挂机人物索引 < this.挂机人物组.Count - 1 ?
                    当前挂机人物索引 + 1 : 0;
                }
                return true;

            }, false, "挂机执行主线程", true);

            button4_Copy1.IsEnabled = false;
            button4_Copy1.Content = "重启";
            button4.Content = "结束";
            button4.IsEnabled = true;
            启动挂机();
            button4_Copy.IsEnabled = true;
        }

        private void 按序号取消选择(int 序号)
        {
            switch (序号)
            {
                case 0:
                    this.按钮组.checkBox.IsChecked = false;
                    return;
                case 1:
                    this.按钮组.checkBox1.IsChecked = false;
                    return;
                case 2:
                    this.按钮组.checkBox2.IsChecked = false;
                    return;
                case 3:
                    this.按钮组.checkBox3.IsChecked = false;
                    return;
            }
        }

        private void 保存设置(string 储存名, 挂机面板_ 挂机面板)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["最近的模拟器角色"];
            if (内容 == null)
            {
                内容 = new KeyValueConfigurationElement("最近的模拟器角色", "");
                设置值组.Add(内容);
            }
            var 分割内容 = 内容.Value.Split(',');

            if (!分割内容.Contains(储存名))
            {
                内容.Value += "," + 储存名;
            }
            var 当前段 = (AppSettingsSection)config.GetSection(储存名);
            if (当前段 == null)
            {
                当前段 = new AppSettingsSection();
                config.Sections.Add(储存名, 当前段);
            }
            当前段.Settings.Clear();

            当前段.Settings.Add("人物名称", 挂机面板.人物名称.Text);
            当前段.Settings.Add("人物职业", 挂机面板.人物职业.Text);
            当前段.Settings.Add("人物等级", 挂机面板.人物等级.Text);
            当前段.Settings.Add("二级密码", 挂机面板.二级密码.Password);

            当前段.Settings.Add("特殊挂机", 挂机面板.特殊挂机.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("捡药", 挂机面板.捡药.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("买药", 挂机面板.买药.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("买药输入框", 挂机面板.买药输入框.Text);
            当前段.Settings.Add("扔药", 挂机面板.扔药.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("扔药输入框", 挂机面板.扔药输入框.Text);
            当前段.Settings.Add("材料行购买", 挂机面板.材料行购买.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("材料行购买下拉框", 挂机面板.材料行购买下拉框.Text);

            当前段.Settings.Add("命令模式", 挂机面板.命令模式.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("号令角色名输入框", 挂机面板.号令角色名输入框.Text);

            当前段.Settings.Add("专打怪物", 挂机面板.专打怪物.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("专打怪物输入框", 挂机面板.专打怪物输入框.Text);

            当前段.Settings.Add("专打boss", 挂机面板.专打boss.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("专打boss输入框", 挂机面板.专打boss输入框.Text);

            当前段.Settings.Add("挂机地图下拉框", 挂机面板.挂机地图下拉框.Text);
            当前段.Settings.Add("定点挂机", 挂机面板.定点挂机.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("定点挂机坐标输入框", 挂机面板.定点挂机坐标输入框.Text);

            当前段.Settings.Add("主动攻击", 挂机面板.主动攻击.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("主动施毒", 挂机面板.主动施毒.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("主动捡物", 挂机面板.主动捡物.IsChecked == true ? "真" : "假");

            当前段.Settings.Add("遇人回避", 挂机面板.遇人回避.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("Boss优先", 挂机面板.Boss优先.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("头目优先", 挂机面板.头目优先.IsChecked == true ? "真" : "假");

            当前段.Settings.Add("高级怪物", 挂机面板.高级怪物.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("高级怪物输入框", 挂机面板.高级怪物输入框.Text);
            当前段.Settings.Add("组队设置", 挂机面板.组队设置.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("组队设置输入框", 挂机面板.组队设置输入框.Text);

            当前段.Settings.Add("军机任务", 挂机面板.军机任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("军机任务下拉框", 挂机面板.军机任务下拉框.SelectedIndex.ToString());

            当前段.Settings.Add("王城任务", 挂机面板.王城任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("不领押镖礼盒", 挂机面板.不领押镖礼盒.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("王城诏令", 挂机面板.王城诏令.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("声望任务", 挂机面板.声望任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("骑兵任务", 挂机面板.骑兵任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("押镖任务", 挂机面板.押镖任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("挖矿任务", 挂机面板.挖矿任务.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("论武任务", 挂机面板.论武任务.IsChecked == true ? "真" : "假");

            当前段.Settings.Add("无需设置", 挂机面板.无需设置.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("输出日志", 挂机面板.输出日志.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("开启录屏", 挂机面板.开启录屏.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("包裹监测间隔输入框", 挂机面板.包裹监测间隔输入框.Text);
            当前段.Settings.Add("下线等待输入框", 挂机面板.下线等待输入框.Text);
            当前段.Settings.Add("自动炼狱时间", 挂机面板.自动炼狱时间.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("自动金币", 挂机面板.自动金币.IsChecked == true ? "真" : "假");
            当前段.Settings.Add("治疗数量", 挂机面板.治疗数量.Text);
            当前段.Settings.Add("红药数量", 挂机面板.红药数量.Text);
            当前段.Settings.Add("蓝药数量", 挂机面板.蓝药数量.Text);
            当前段.Settings.Add("道符数量", 挂机面板.道符数量.Text);
            当前段.Settings.Add("红毒数量", 挂机面板.红毒数量.Text);
            当前段.Settings.Add("绿毒数量", 挂机面板.绿毒数量.Text);
            当前段.Settings.Add("随机数量", 挂机面板.随机数量.Text);
            当前段.Settings.Add("圣水数量", 挂机面板.圣水数量.Text);
            当前段.Settings.Add("F1", 挂机面板.F1.Text);
            当前段.Settings.Add("F2", 挂机面板.F2.Text);
            当前段.Settings.Add("F3", 挂机面板.F3.Text);
            当前段.Settings.Add("F4", 挂机面板.F4.Text);
            当前段.Settings.Add("F5", 挂机面板.F5.Text);
            当前段.Settings.Add("F6", 挂机面板.F6.Text);
            当前段.Settings.Add("F7", 挂机面板.F7.Text);
            当前段.Settings.Add("F8", 挂机面板.F8.Text);
            config.Save(ConfigurationSaveMode.Modified);
        }

        private void button4_Copy_Click(object sender, RoutedEventArgs e)
        {
            执行线程.暂停();
            其他_.打印("暂停执行");
            button4_Copy1.IsEnabled = true;
            button4_Copy.IsEnabled = false;
        }

        private void 启动挂机()
        {
            if (this.挂机人物组.Count > 0)
            {
                执行线程.启动();
            }
            else
            {
                其他_.打印("没有启动任何模拟器");
            }
        }

        private void 保存挂机角色(string g, 挂机角色_ 挂机角色)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var 设置值组 = config.AppSettings.Settings;
            var 内容 = 设置值组["最近的模拟器"];
            if (内容 == null)
            {
                内容 = new KeyValueConfigurationElement("最近的模拟器", "");
                设置值组.Add(内容);
            }
            var 分割内容 = 内容.Value.Split(',');

            if (!分割内容.Contains(g))
            {
                内容.Value += "," + g;
            }
            var 当前段 = (AppSettingsSection)config.GetSection(g);
            if (当前段 == null)
            {
                当前段 = new AppSettingsSection();
                config.Sections.Add(g, 当前段);
            }
            当前段.Settings.Clear();
            当前段.Settings.Add("角色", 挂机角色 == 挂机角色_.左 ? "左" : "右");
            config.Save(ConfigurationSaveMode.Modified);
        }
        private string 读取挂机角色(string g)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            var 设置值组 = config.AppSettings.Settings;
            if (设置值组["最近的模拟器"] != null)
            {
                var strings = 设置值组["最近的模拟器"].Value.Split(',');
                if (strings.Contains(g))
                {
                    return 获取角色记录(g);
                }
            }
            return "左";
        }
        private Dictionary<string, string> 读取配置记录(string g)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            var 设置值组 = config.AppSettings.Settings;
            if (设置值组["最近的模拟器角色"] != null)
            {
                var strings = 设置值组["最近的模拟器角色"].Value.Split(',');
                if (strings.Contains(g))
                {
                    return 获取账号设置记录(g);
                }
            }
            return null;
        }
        private string 获取角色记录(string 模拟器名)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            var 历史记录 = (AppSettingsSection)config.GetSection(模拟器名);
            if (历史记录 != null)
            {
                return 历史记录.Settings["角色"].Value;
            }
            return "";
        }

        private Dictionary<string, string> 获取账号设置记录(string 当前账号)
        {
            Dictionary<string, string> 设置 = new Dictionary<string, string>();
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            var 历史记录 = (AppSettingsSection)config.GetSection(当前账号);
            if (历史记录 != null)
            {
                设置.Add("人物名称", 历史记录.Settings["人物名称"].Value);
                设置.Add("人物职业", 历史记录.Settings["人物职业"].Value);
                设置.Add("人物等级", 历史记录.Settings["人物等级"].Value);
                设置.Add("二级密码", 历史记录.Settings["二级密码"].Value);
                设置.Add("特殊挂机", 历史记录.Settings["特殊挂机"].Value);
                设置.Add("捡药", 历史记录.Settings["捡药"].Value);
                设置.Add("买药", 历史记录.Settings["买药"].Value);
                设置.Add("买药输入框", 历史记录.Settings["买药输入框"].Value);
                设置.Add("扔药", 历史记录.Settings["扔药"].Value);
                设置.Add("扔药输入框", 历史记录.Settings["扔药输入框"].Value);
                设置.Add("材料行购买", 历史记录.Settings["材料行购买"].Value);
                设置.Add("材料行购买下拉框", 历史记录.Settings["材料行购买下拉框"].Value);
                设置.Add("命令模式", 历史记录.Settings["命令模式"].Value);
                设置.Add("号令角色名输入框", 历史记录.Settings["号令角色名输入框"].Value);
                设置.Add("专打怪物", 历史记录.Settings["专打怪物"].Value);
                设置.Add("专打怪物输入框", 历史记录.Settings["专打怪物输入框"].Value);

                设置.Add("专打boss", 历史记录.Settings["专打boss"].Value);
                设置.Add("专打boss输入框", 历史记录.Settings["专打boss输入框"].Value);

                设置.Add("挂机地图下拉框", 历史记录.Settings["挂机地图下拉框"].Value);
                设置.Add("定点挂机", 历史记录.Settings["定点挂机"].Value);
                设置.Add("定点挂机坐标输入框", 历史记录.Settings["定点挂机坐标输入框"].Value);
                设置.Add("主动攻击", 历史记录.Settings["主动攻击"].Value);
                设置.Add("主动施毒", 历史记录.Settings["主动施毒"].Value);
                设置.Add("主动捡物", 历史记录.Settings["主动捡物"].Value);
                设置.Add("遇人回避", 历史记录.Settings["遇人回避"].Value);
                设置.Add("Boss优先", 历史记录.Settings["Boss优先"].Value);
                设置.Add("头目优先", 历史记录.Settings["头目优先"].Value);
                设置.Add("高级怪物", 历史记录.Settings["高级怪物"].Value);
                设置.Add("高级怪物输入框", 历史记录.Settings["高级怪物输入框"].Value);
                设置.Add("组队设置", 历史记录.Settings["组队设置"].Value);
                设置.Add("组队设置输入框", 历史记录.Settings["组队设置输入框"].Value);
                设置.Add("军机任务", 历史记录.Settings["军机任务"].Value);
                设置.Add("军机任务下拉框", 历史记录.Settings["军机任务下拉框"].Value);
                设置.Add("王城任务", 历史记录.Settings["王城任务"].Value);
                设置.Add("不领押镖礼盒", 历史记录.Settings["不领押镖礼盒"].Value);
                设置.Add("王城诏令", 历史记录.Settings["王城诏令"].Value);
                设置.Add("声望任务", 历史记录.Settings["声望任务"].Value);
                设置.Add("骑兵任务", 历史记录.Settings["骑兵任务"].Value);
                设置.Add("押镖任务", 历史记录.Settings["押镖任务"].Value);
                设置.Add("挖矿任务", 历史记录.Settings["挖矿任务"].Value);
                设置.Add("论武任务", 历史记录.Settings["论武任务"].Value);
                设置.Add("无需设置", 历史记录.Settings["无需设置"].Value);
                设置.Add("输出日志", 历史记录.Settings["输出日志"].Value);
                设置.Add("开启录屏", 历史记录.Settings["开启录屏"].Value);
                设置.Add("包裹监测间隔输入框", 历史记录.Settings["包裹监测间隔输入框"].Value);
                设置.Add("下线等待输入框", 历史记录.Settings["下线等待输入框"].Value);
                设置.Add("自动炼狱时间", 历史记录.Settings["自动炼狱时间"].Value);
                设置.Add("自动金币", 历史记录.Settings["自动金币"].Value);
                设置.Add("治疗数量", 历史记录.Settings["治疗数量"].Value);
                设置.Add("红药数量", 历史记录.Settings["红药数量"].Value);
                设置.Add("蓝药数量", 历史记录.Settings["蓝药数量"].Value);
                设置.Add("道符数量", 历史记录.Settings["道符数量"].Value);
                设置.Add("红毒数量", 历史记录.Settings["红毒数量"].Value);
                设置.Add("绿毒数量", 历史记录.Settings["绿毒数量"].Value);
                设置.Add("随机数量", 历史记录.Settings["随机数量"].Value);
                设置.Add("圣水数量", 历史记录.Settings["圣水数量"].Value);
                设置.Add("F1", 历史记录.Settings["F1"].Value);
                设置.Add("F2", 历史记录.Settings["F2"].Value);
                设置.Add("F3", 历史记录.Settings["F3"].Value);
                设置.Add("F4", 历史记录.Settings["F4"].Value);
                设置.Add("F5", 历史记录.Settings["F5"].Value);
                设置.Add("F6", 历史记录.Settings["F6"].Value);
                设置.Add("F7", 历史记录.Settings["F7"].Value);
                设置.Add("F8", 历史记录.Settings["F8"].Value);
            }
            return 设置;
        }

        private void 角色左_0_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox.Content.ToString(), 挂机角色_.左);
            模拟器一读存();
        }

        private void 角色右_0_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox.Content.ToString(), 挂机角色_.右);
            模拟器一读存();
        }

        private void 模拟器一读存()
        {
            string 名称2 = this.按钮组.checkBox.Content.ToString() + (((bool)this.模拟器一设置.挂机人物_左.IsChecked) ? "_左" : "_右");
            var dic = 读取配置记录(名称2);
            if (dic != null)
            {
                读取设置记录(dic, this.模拟器一设置);
            }
        }

        private void 角色左_1_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox1.Content.ToString(), 挂机角色_.左);
            模拟器二读存();
        }

        private void 角色右_1_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox1.Content.ToString(), 挂机角色_.右);
            模拟器二读存();
        }

        private void 模拟器二读存()
        {
            string 名称2 = this.按钮组.checkBox1.Content.ToString() + (((bool)this.模拟器二设置.挂机人物_左.IsChecked) ? "_左" : "_右");
            var dic = 读取配置记录(名称2);
            if (dic != null)
            {
                读取设置记录( dic, this.模拟器二设置);
            }
        }

        private void 角色左_2_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox2.Content.ToString(), 挂机角色_.左);
            模拟器三读存();
        }

        private void 角色右_2_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox2.Content.ToString(), 挂机角色_.右);
            模拟器三读存();
        }

        private void 模拟器三读存()
        {
            string 名称2 = this.按钮组.checkBox2.Content.ToString() + (((bool)this.模拟器三设置.挂机人物_左.IsChecked) ? "_左" : "_右");
            var dic = 读取配置记录(名称2);
            if (dic != null)
            {
                读取设置记录(dic, this.模拟器三设置);
            }
        }

        private void 角色左_3_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox3.Content.ToString(), 挂机角色_.左);
            模拟器四读存();
        }

        private void 角色右_3_Checked(object sender, EventArgs e)
        {
            if (!UI完成初始化) return;
            保存挂机角色(this.按钮组.checkBox3.Content.ToString(), 挂机角色_.右);
            模拟器四读存();
        }

        private void 模拟器四读存()
        {
            string 名称2 = this.按钮组.checkBox3.Content.ToString() + (((bool)this.模拟器四设置.挂机人物_左.IsChecked) ? "_左" : "_右");
            var dic = 读取配置记录(名称2);
            if (dic != null)
            {
                读取设置记录(dic, this.模拟器四设置);
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            保存窗口位置(sender, e);
        }
    }
}
